------------------------------------------------------------------------------------------
BASIC BIOS CALLS
------------------------------------------------------------------------------------------

	MOV	AX,0003H		; Reset screen to Text, 80x25
	INT	10H			;

	MOV	AX,0700H		; AL := ReadKey (no ^C check)
	INT	21H			;

	MOV	AX,0100H		; If KeyPressed Then Z=0 Else Z=1
	INT	16H			;

	MOV	DL,__			; Print ASCII character in DL (text mode only)
	MOV	AH,2			; (7=Bell, 9=Tab, 13=Carriage Return, 10=LineFeed)
	INT	21H			;

	MOV	AH,2CH			; Get Time of Day from system
	INT	21H			; CH=HH, CL=MM, DH=SS, DL=TT

	MOV	AX,0013H		; Graphics Mode, 320x200, 256 color
	INT	10H			;

	MOV	AH,4CH			; Exit to DOS
	INT	21H			;

------------------------------------------------------------------------------------------
MACRO NOTES
------------------------------------------------------------------------------------------

Save basic registers.

	SaveRegs MACRO
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
	endm

	"SaveRegs" is a user-defined symbol, and can be changed if necessary.
	Use "SaveRegs" as an "op-code" whenever necessary to save all registers.

------------------------------------------------------------------------------------------

Restore basic registers.

	RestoreRegs MACRO

		POP DX
		POP CX
		POP BX
		POP AX
	endm

	"RestoreRegs" is a user-defined symbol, and can be changed if necessary.
	Use "RestoreRegs" as an "op-code" whenever necessary to restore all registers.

------------------------------------------------------------------------------------------
VGA GRAPHICS VIDEO NOTES
------------------------------------------------------------------------------------------

Put Pixel on screen.

	MOV	BX,____			; Offset of pixel (0..63999)
	MOV	AX,0A000H		;
	MOV	ES,AX			; ES := Segment of VGA
	MOV	AL,__			; AL := Color value
	MOV	[ES:BX],AL		; [ES:BX] := Color

------------------------------------------------------------------------------------------

Get Pixel from screen.

	MOV	BX,____			; Offset of pixel (0..63999)
	MOV	AX,0A000H		;
	MOV	ES,AX			; ES := Segment of VGA
	MOV	AL,[ES:BX]		; AL := [ES:BX]

------------------------------------------------------------------------------------------

Clear Screen.

	CLD				; Direction for STOSW is forward (increment)
	MOV	AL,__			; AL := Color value
	MOV	AH,AL			; Duplicate color into AH
	MOV	BX,0A000H		;
	MOV	ES,BX			; ES := Segment of VGA
	MOV	DI,0			; Starting Offset = 0
	MOV	CX,32000		; Count = number of words per screen (not bytes)
    REP	STOSW				; While CX > 0 Do [ES:DI] := AX ; DI := DI + 2 ; CX := CX - 1 ;

------------------------------------------------------------------------------------------

Wait for Vertical Retrace.

	MOV	DX,3DAH			; VGA Input Status Register
					;
   Retrace1:				;
	IN	AL,DX			; AL := Port[03DAH]
	TEST	AL,8			; Is bit 3 set?
	JZ	Retrace1		; No, continue waiting
					;
   Retrace2:				;

	IN	AL,DX			; AL := Port[03DAH]
	TEST	AL,8			; Is bit 3 unset?
	JNZ	Retrace2		; No, continue waiting

------------------------------------------------------------------------------------------
KEYBOARD NOTES
------------------------------------------------------------------------------------------

Set keyboard typematic rate.

	MOV	AH,03H			;
	MOV	AL,05H			;
	MOV	BH,____			; Delay (00H = fastest)
	MOV	BL,____			; Rate  (0CH = 10cps)
	INT	16H			;

	Delays:		Rate (00H-1FH):
	00H =  250ms	00H = 30  cps
	01H =  500ms	01H = 26.7cps
	02H =  750ms	02H = 24  cps
	03H = 1000ms	03H = 21.8cps
			07H = 16  cps
			08H = 15  cps
			0AH = 12  cps
			0CH = 10  cps
			0FH =  8  cps
			12H =  6  cps
			14H =  5  cps
			17H =  4  cps
			1FH =  2  cps

------------------------------------------------------------------------------------------
MOUSE NOTES
------------------------------------------------------------------------------------------

Mouse reset.

	MOV	AX,0000H		;
	INT	33H			;

	Returns AX=status (0=no mouse installed, 1=mouse installed and reset)
	Returns BX=number of buttons.

------------------------------------------------------------------------------------------

Read mouse motion counters.

	MOV	AX,000BH		;
	INT	33H			;

	Returns CX=horizontal count in "mickeys" (-32768..+32767) since last call.
	Returns DX=vertical   count in "mickeys" (-32768..+32767) since last call.
	Values are reset as a result of the call.
	Number of mickeys returned depends on dpi rating of mouse.

------------------------------------------------------------------------------------------

Get mouse button status.

	MOV	AX,0003H		;
	INT	33H			;

	Returns BX=button status (bit 0 = left button, bit 1 = right button), 1=pressed.
	(Also returns H position in CX and V position in DX, but these depend on
	a specific video mode to work, and will not be useful in mode 13H graphics.)

------------------------------------------------------------------------------------------

Get button press information.

	MOV	AX,0005H		;
	MOV	BX,____			; 0=left button, 1=right button
	INT	33H			;

	Returns AX=button status (bit 0 = left button, bit 1 = right button), 1=pressed.
	Returns BX=count of button presses (0..65535).
	Returns CX=Horizontal position at last press (not useful to mode 13H graphics).
	Returns DX=Vertical   position at last press (not useful to mode 13H graphics).

------------------------------------------------------------------------------------------
PALETTE NOTES
------------------------------------------------------------------------------------------

Read a block of VGA palette entries.

	MOV	AX,1017H		;
	MOV	BX,____			; Starting palette number
	MOV	CX,____			; Number of entries to fetch
	PUSH	DS			;
	POP	ES			;
	MOV	DX,OFFSET ________	; OFFSET to palette buffer [ES:DX]
	INT	10H			;

	Palette buffer size is 3 * number_of_entries to fetch.
	Each palette entry is 3-byte RGB color, each byte value in range 0..63 (6 bit).
	To fetch entire palette: BX=0, CX=256, palette buffer reserves 3*256=768 bytes.

------------------------------------------------------------------------------------------

Write a block of VGA palette entries.

	MOV	AX,1012H		;
	MOV	BX,____			; Starting palette number
	MOV	CX,____			; Number of entries to store
	PUSH	DS			;
	POP	ES			;
	MOV	DX,OFFSET ________	; OFFSET to palette buffer [ES:DX]
	INT	10H			;

	Palette buffer size is 3 * number_of_entries to fetch.
	Each palette entry is 3-byte RGB color, each byte value in range 0..63 (6 bit).
	To store entire palette: BX=0, CX=256, palette buffer reserves 3*256=768 bytes.

------------------------------------------------------------------------------------------
FILE I/O NOTES
------------------------------------------------------------------------------------------

Open a file for reading.

	MOV	AH,03DH			;
	MOV	AL,____			; 00=Read only, 02=R/W
	MOV	DX,OFFSET ________	; Offset of ASCIIZ string of File Name
	INT	21H			;

	Returns C=1 if open is bad, C=0 if OK.
	Returns AX=file handle for subsequent reads.
	Returns AX=error code if C=1.

------------------------------------------------------------------------------------------

Read a block of data.

	MOV	AH,03FH			;
	MOV	BX,_______		; file handle
	MOV	CX,_______		; Maximum number of bytes to read
	MOV	DX,OFFSET ________	; Offset of buffer to read into
	INT	21H			;

	Returns C=1 if read is bad, C=0 if OK.
	Returns AX=bytes actually read, 0 if at End-of-File.
	Returns AX=error code if C=1.

------------------------------------------------------------------------------------------

Open a file for writing (create file).

	MOV	AH,03CH			;
	MOV	CX,____			; Normal=0 (R/W)
	MOV	DX,OFFSET ________	; Offset of ASCIIZ string of File Name
	INT	21H			;

	Returns C=1 if create is bad, C=0 if OK.
	Returns AX=file handle for subsequent writes.
	Returns AX=error code if C=1.

	Files may be created with different attributes (in CX) by
	OR-ing any of the desired following values:
		0001H = Read only
		0002H = Hidden
		0004H = System
		0008H = Volume
		0020H = Archive

------------------------------------------------------------------------------------------

Write a block of data.

	MOV	AH,040H			; 
	MOV	BX,________		; file handle
	MOV	CX,________		; number of bytes to write
	MOV	DX,OFFSET _________	; Offset of buffer to write from
	INT	21H			;

	Returns C=1 if write is bad, C=0 if OK.
	Returns AX=bytes actually written.
	Returns AX=error code if C=1.

	If number of bytes to write = 0 then file will be truncated at current position.
	If bytes written < bytes to write then file or disk is full.

	Special file handles (BX):
	0	Keyboard	STDIN
	1	Display		STDOUT
	2	Display		STDERR
	3	Aux Device	STDAUX (COM1:)
	4	Printer		STDPRN (LPT1:)

------------------------------------------------------------------------------------------

Close a file (whether opened for reading or writing).

	MOV	AH,03EH			; 
	MOV	BX,________		; file handle
	INT	21H			;

	Returns C=1 if close is bad, C=0 if OK.
	Returns AX=error code if C=1.

------------------------------------------------------------------------------------------

Delete a file.

	MOV	AH,041H			;
	MOV	DX,OFFSET ________	; Offset of ASCIIZ string of File Name
	INT	21H			;

	Returns C=1 if delete bad, C=0 if OK.
	Returns AX=error code if C=1.

------------------------------------------------------------------------------------------

Create Directory (md / mkdir).

	MOV	AH,039H			;
	MOV	DX,OFFSET ________	; Offset of ASCIIZ directory path string
	INT	21H			;

	Returns C=1 if create bad, C=0 if OK.
	Returns AX=error code if C=1.

------------------------------------------------------------------------------------------

Remove Directory (rd / rmdir).

	MOV	AH,3AH			;
	MOV	DX,OFFSET ________	; Offset of ASCIIZ directory path string
	INT	21H			;

	Returns C=1 if remove bad, C=0 if OK.
	Returns AX=error code if C=1.

------------------------------------------------------------------------------------------

Change Directory (cd / chdir).

	MOV	AH,3BH			;
	MOV	DX,OFFSET ________	; Offset of ASCIIZ directory path string
	INT	21H			;

	Returns C=1 if change bad, C=0 if OK.
	Returns AX=error code if C=1.

	Pathname string limited to 64 characters.

------------------------------------------------------------------------------------------

Error Codes in AX:
	01	Invalid function code
	02	File not found
	03	Path not found
	04	Too many open files
	05	Access denied
	06	Invalid handle
	07	Arena trashed
	08	Insufficient memory
	09	Invalid block
	0A	Invalid environment
	0B	Invalid format
	0C	Invalid access code
	0D	Invalid data
	0E	---
	0F	Invalid drive
	10	Attempt to remove current directory
	11	Not same device
	12	No more files
	13	Disk is write protected
	14	Bad disk unit
	15	Drive not ready
	16	Invalid command
	17	CRC error
	18	Bad request structure length
	19	Seek error
	1A	Not a DOS disk
	1B	Sector not found
	1C	Out of paper
	1D	Write fault
	1E	Read fault
	1F	General failure
	20	Sharing violation
	21	Lock violation
	22	Wrong disk
	23	FCB unavailable
	24	Sharing buffer overflow
	25	Error code page mismatched
	26	Handle EOF
	27	Handle disk full
	28-31	---
	32-48	mostly network errors
	49-4F	---
	50	File exists
	51	Duplicate FCB
	52	Cannot make directory entry
	53	Interrupt 24H failure
	54	Out of structures
	55	Already assigned
	56-5A	mostly network errors

------------------------------------------------------------------------------------------

